/*
 * HElemento.cpp - Grupo 5 - Prog. Avanzada 2011
 *
 *  Javier Dominguez - 4.901.161-6
 *  Marcelo Parada - 1.977.094-9
 *  Rodrigo Ruiz - 4.481.611-2
 *  Maximiliano Silvera - 4.106.938-6
 */

#include "HElemento.h"

HElemento::HElemento()
{
	sig_id_tema = 1;

	colArtista = new ColConcrete<Artista*>();

	colAlbum = new ColConcrete<Album*>();

	colTema = new ColConcrete<Tema*>();

	colTemaArtista = new ColConcrete<TemaArtista*>();
}

HElemento *HElemento::instance;

HElemento *HElemento::getInstance()
{
	if(instance == NULL)
	{
		instance = new HElemento();
	}

	return instance;
}

Artista *HElemento::obtenerArtista(string nombre)
{
	ConcreteIterator<Artista*> *iterArtista = colArtista->getIterator();

	while(iterArtista->hasCurrent())
	{
		Artista* curr = iterArtista->current();

		if(curr->getNombre().compare(nombre) == 0)
		{
			return curr;
		}
	}

	return NULL;
}

void HElemento::crearArtista(ArtistaDT *artistaDT)
{
	if(artistaDT->tipoArtistaDT() == Solista::TIPO_ARTISTA)
	{
		SolistaDT *solistaDT = (SolistaDT*) artistaDT;

		colArtista->add(new Solista(solistaDT->getNombre()));
	}
	else if(artistaDT->tipoArtistaDT() == Banda::TIPO_ARTISTA)
	{
		BandaDT *bandaDT = (BandaDT*) artistaDT;

		colArtista->add(new Banda(bandaDT->getNombre(), bandaDT->getIntegrantes()));
	}

}

void HElemento::crearAlbum(AlbumDT *albumDT)
{
	colAlbum->add(new Album(albumDT->getNombre(), albumDT->getAnioEdicion()));
}

int HElemento::crearTema(TemaDT *temaDT)
{
	int idTema = this->sig_id_tema++;

	if(temaDT->tipoTemaDT() == Single::TIPO_TEMA)
	{
		SingleDT *singleDT = (SingleDT*) temaDT;

		colTema->add(new Single(idTema, singleDT->getAnioGrabacion(), singleDT->getTitulo(), singleDT->getTiempo()));
	}
	else if(temaDT->tipoTemaDT() == Pista::TIPO_TEMA)
	{
		PistaDT *pistaDT = (PistaDT*) temaDT;

		colTema->add(new Pista(idTema, pistaDT->getNumero(), pistaDT->getTitulo(), pistaDT->getTiempo()));
	}

	return idTema;
}

void HElemento::crearTemaArtista(string tituloTema, string nombreArtista)
{
	// Busco el tema a asociar
	ConcreteIterator<Tema*> *iterTema = colTema->getIterator();

	Tema *temaCurr = NULL;

	while(temaCurr == NULL && iterTema->hasCurrent())
	{
		temaCurr = iterTema->current();

		if(!temaCurr->getTitulo().compare(tituloTema) == 0)
		{
			temaCurr = NULL;
		}
	}

	// Busco el artista a asociar
	ConcreteIterator<Artista*> *iterArtista = colArtista->getIterator();

	Artista *artistaCurr = NULL;

	while(artistaCurr == NULL && iterArtista->hasCurrent())
	{
		artistaCurr = iterArtista->current();

		if(!artistaCurr->getNombre().compare(nombreArtista) == 0)
		{
			artistaCurr = NULL;
		}
	}

	// Asocio si existe el tema y el artista
	if(temaCurr == NULL)
	{
		// TODO LANZAR EXCEPCION DE ARGUMENTO NO VLIDO
	}

	if(artistaCurr == NULL)
	{
		// TODO LANZAR EXCEPCION DE ARGUMENTO NO VLIDO
	}

	colTemaArtista->add(new TemaArtista(temaCurr, artistaCurr));
}

HElemento::~HElemento()
{
	delete instance;

	delete colArtista;

	delete colAlbum;

	delete colTema;

	delete colTemaArtista;

	colArtista->~ColConcrete();
}
